-- Nuevo campo para preciomoneda con iva y las modificaciones del caso en la funcion de 
-- actualizacion del prexart.


ALTER TABLE public.artm
    ADD COLUMN preciomonedaciva numeric(16,4);

--

CREATE or replace FUNCTION public.tg_artm_ins_preultcompra()
    RETURNS trigger
    LANGUAGE 'plpgsql'
    COST 100
    VOLATILE NOT LEAKPROOF
AS $BODY$
DECLARE

vModificaPrecios Com.ModificaPrecios%TYPE;

vverpreciosconiva  Com.verpreciosconiva%TYPE;

vPreId    Pre.Id%TYPE;

vPreIdMon Pre.Id%TYPE;

vTipoCom Com.Tipo%TYPE;

vFecha Comm.Fecha%TYPE;

vHayPosteriores boolean;

vCantPre INTEGER;

vPrecioNuevo    artm.precio%type; 

vPrecioNuevoMon artm.precio%type; 

BEGIN

IF (New.PrecioLista is null) OR (New.PrecioLista <> -1) then

   SELECT Com.ModificaPrecios, Pre.Id, com.tipo, comm.fecha, PreMon.Id

   INTO vModificaPrecios,   vPreId,  vTipoCom, vFecha, vPreIdMon

   FROM public.ComM

   INNER JOIN public.Com ON (ComM.TipoCom = Com.Tipo)

   INNER JOIN public.Pre ON (CASE WHEN NEW.CODVALMON = '$' THEN Com.CodPre ELSE COM.CODPREMON END = Pre.Cod and 1 = Pre.IdPreLis)

   LEFT JOIN  public.Pre PreMon ON (CASE WHEN NEW.CODVALMON <> '$' THEN Com.CodPreMon ELSE COM.CodPre END = PreMon.Cod AND 1 = PreMon.IdPreLis) -- Segunda condicion es porque falta un campo IdPreLis en COM  (Com.IdPreLis = Pre.IdPreLis) 

   WHERE (ComM.Id = NEW.IdComM);

   IF vModificaPrecios is not null and vModificaPrecios <> 'N' then

      select verpreciosconiva into vverpreciosconiva from com, comm where comm.id = new.idcomm and com.tipo = comm.tipocom; 

      vPrecioNuevo = new.precio;

      vPrecioNuevoMon = case when new.codvalmon <> '$' then new.preciomoneda else new.precio end;   

      if vverpreciosconiva = 'S' then
         vPrecioNuevo    = new.preciociva;   
		 if (new.codvalmon <> '$') then 
		    vPrecioNuevoMon = case when new.preciomonedaciva is null then new.preciomoneda * new.preciociva / new.precio else new.preciomonedaciva end; 
		 else 
			vPrecioNuevoMon = case when new.preciomonedaciva is null then new.preciociva else new.preciomonedaciva end;   
		 end if;

      end if;

      IF (vModificaPrecios = 'S') or (vModificaPrecios = 'A') THEN

--    Lo modifica solo si no existe un movimiento similar con fecha mayor !!!!!!

         Select (Exists (Select * from artm, comm, com, pre  

                                where comm.fecha > vFecha and artm.idart = New.idart and Comm.TipoCom = Com.Tipo 

                                and artm.idcomm = comm.id and com.ModificaPrecios in ('S','>') 

                                and (CASE WHEN ARTM.CODVALMON = '$' THEN Com.CodPre ELSE COM.CODPREMON END = Pre.Cod) and pre.id = vPreId)) 

         into vHayPosteriores;   

         IF not(vHayPosteriores) then

            UPDATE public.PreXArt SET Valor = CASE WHEN NEW.CODVALMON = '$' THEN vPrecioNuevo ELSE vPrecioNuevoMon END 

            WHERE (IdPre = vPreId) AND (IdArt = NEW.IdArt);

            if (NOT FOUND) THEN

               INSERT INTO public.PreXArt (IdPre, IdArt, Valor) 

               VALUES (vPreId, NEW.IdArt, CASE WHEN NEW.CODVALMON = '$' THEN vPrecioNuevo ELSE vPrecioNuevoMon END);

            end if;

            if vModificaPrecios = 'A' then

               UPDATE public.PreXArt SET Valor = case when new.codvalmon <> '$' then vPrecioNuevoMon else vPrecioNuevo end

               WHERE (IdPre = vPreIdMon) AND (IdArt = NEW.IdArt);

               if (NOT FOUND) THEN

                  INSERT INTO public.PreXArt (IdPre, IdArt, Valor) 

                  VALUES (vPreIdMon, NEW.IdArt, vPrecioNuevoMon);

               end if;

            end if;

         END IF;

       ELSE

         IF (vModificaPrecios = '>') THEN  

            SELECT Count(*) INTO vCantPre FROM public.PreXArt WHERE (IdPre = vPreId) AND (IdArt = NEW.IdArt);

            IF (vCantPre != 0) THEN

               UPDATE public.PreXArt SET Valor = CASE WHEN NEW.CODVALMON = '$' THEN vPrecioNuevo ELSE vPrecioNuevoMon END

               WHERE (IdPre = vPreId) AND (IdArt = NEW.IdArt) AND (vPrecioNuevo > VALOR);

             ELSE

               INSERT INTO public.PreXArt (IdPre, IdArt, Valor) 

               VALUES (vPreId, NEW.IdArt, CASE WHEN NEW.CODVALMON = '$' THEN vPrecioNuevo ELSE vPrecioNuevoMon END);

             END IF;

         END IF;

         IF (vModificaPrecios = 'M') THEN  

            SELECT Count(*) INTO vCantPre FROM public.PreXArt WHERE (IdPre = vPreIdMon) AND (IdArt = NEW.IdArt);

            IF (vCantPre != 0) THEN

               UPDATE public.PreXArt SET Valor = vPrecioNuevoMon

               WHERE (IdPre = vPreIdMon) AND (IdArt = NEW.IdArt) AND (vPrecioNuevoMon > VALOR);

             ELSE

               INSERT INTO public.PreXArt (IdPre, IdArt, Valor) VALUES (vPreIdMon, NEW.IdArt, vPrecioNuevoMon);

             END IF;

         END IF;

      END IF; -- (vModificaPrecios = 'S') or (vModificaPrecios = 'A')

    END IF; -- vModificaPrecios is not null and <> 'N'

END IF; --  GENERAL

RETURN NEW;

END;
$BODY$;

ALTER FUNCTION public.tg_artm_ins_preultcompra()
    OWNER TO abacouser;

COMMENT ON FUNCTION public.tg_artm_ins_preultcompra()
    IS 'Cuerpo del trigger de artm que actualiza una variable de precio de un articulo segun si el comprobante modifica precio o no.';

-- ====================================
SELECT aaVersion('488.00', '487.00');
-- ====================================
